import futbol5.Condicional
import futbol5.Estandar
import futbol5.Jugador
import futbol5.Partido
import observers.Mail
import observers.MailAMuchos
import observers.MailAdmin
import observers.MessageSender
import org.junit.Before
import org.junit.Test

import static org.mockito.Matchers.*
import static org.mockito.Mockito.*
import futbol5.Administrador
import futbol5.CompuestaAND
import futbol5.CompuestaOR


class TestObservers {
	Partido partido
	Jugador ale
	Jugador eric
	Jugador daiana
	Condicional tipoAle
	Administrador adminPartidos
	CompuestaAND compAnd
	CompuestaOR compOr


	@Before
	def void init(){
		partido = new Partido
		
		ale = new Jugador
		eric = new Jugador
		daiana = new Jugador
		
		adminPartidos = new Administrador
		
				
		
		tipoAle = new Condicional
		ale.categoria = tipoAle
		eric.categoria = new Estandar
		daiana.categoria = new Estandar
		
		compAnd = new CompuestaAND
		compOr = new CompuestaOR
		
		partido.agregarJugador(eric)
		}
	
	@Test
	 def void testEnvioAdminTodosConfirmados(){
	 	var mockedMailSender = mock(typeof(MessageSender))
 	 	var mailAdministrador = new MailAdmin(mockedMailSender)
		mailAdministrador.llegueADiez()
	 	
	 	verify(mockedMailSender, times(1)).send(any(typeof(Mail)))
	 }
	 
	  @Test
	 def void testEnvioAdminSeConfirmaronObs(){
	 	var cristian = new Jugador
	 	cristian.categoria = new Estandar
	 	var miguel = new Jugador 
	 	miguel.categoria = new Estandar
	 	var alex = new Jugador 
	 	alex.categoria = new Estandar
	 	var karina = new Jugador 
	 	karina.categoria = new Estandar
	 	var pedro = new Jugador 
	 	pedro.categoria = new Estandar
	 	var caro = new Jugador 
	 	caro.categoria = new Estandar
	 	var pablo = new Jugador 
	 	pablo.categoria = new Estandar
	 	ale.categoria = new Estandar
	 	
	 	var mockedMailSender = mock(typeof(MessageSender))
 	 	var mailPorConfirmado = new MailAdmin(mockedMailSender)
 	 	
 	 	partido.observers.add(mailPorConfirmado)
 	 			 	
	 	partido.agregarJugador(cristian)
	 	partido.agregarJugador(miguel)
	 	partido.agregarJugador(alex)
	 	partido.agregarJugador(karina)
	 	partido.agregarJugador(pedro)
	 	partido.agregarJugador(caro)
	 	partido.agregarJugador(pablo)
	 	partido.agregarJugador(daiana)
	 	partido.agregarJugador(ale)
	 	
	 	verify(mockedMailSender, times(1)).send(any(typeof(Mail)))	 	
	 }
	
	@Test
	 def void testEnvioAdminSeBajaron(){	 	
 	 	var mockedMailSender = mock(typeof(MessageSender))
 	 	var mailPorBaja = new MailAdmin(mockedMailSender)	
 	 	mailPorBaja.seBajoAlguno()
	 	
	 	verify(mockedMailSender, times(1)).send(any(typeof(Mail)))
	 	
	 }
	 
	  @Test
	 def void testEnvioAdminSeBajaronObs(){
	 	var cristian = new Jugador
	 	cristian.categoria = new Estandar
	 	var miguel = new Jugador 
	 	miguel.categoria = new Estandar
	 	var alex = new Jugador 
	 	alex.categoria = new Estandar
	 	var karina = new Jugador 
	 	karina.categoria = new Estandar
	 	var pedro = new Jugador 
	 	pedro.categoria = new Estandar
	 	var caro = new Jugador 
	 	caro.categoria = new Estandar
	 	var pablo = new Jugador 
	 	pablo.categoria = new Estandar
	 	ale.categoria = new Estandar
	 	
	 	var mockedMailSender = mock(typeof(MessageSender))
 	 	var mailPorBaja = new MailAdmin(mockedMailSender)
 	 	
 	 	partido.observers.add(mailPorBaja)
 	 			 	
	 	partido.agregarJugador(cristian)
	 	partido.agregarJugador(miguel)
	 	partido.agregarJugador(alex)
	 	partido.agregarJugador(karina)
	 	partido.agregarJugador(pedro)
	 	partido.agregarJugador(caro)
	 	partido.agregarJugador(pablo)
	 	partido.agregarJugador(ale)
	 	partido.agregarJugador(daiana)
	 	
	 	verify(mockedMailSender, times(1)).send(any(typeof(Mail)))
	 }
	
	@Test
	def void testATodos(){
		partido.agregarJugador(daiana)
		ale.categoria = new Estandar
		partido.agregarJugador(ale)
		
		var mockedMailSender = mock(typeof(MessageSender))
 	 	var mailATodos = new MailAMuchos(mockedMailSender)	
 	 	mailATodos.avisaQueJuego(partido.jugadores)
	 	
	 	verify(mockedMailSender, times(3)).send(any(typeof(Mail)))
	}
	
	@Test
	def void testEnvioTodosLosJugadoresConObservers() {
		var mockedMailSender = mock(typeof(MessageSender))
		partido.observers.add(new MailAMuchos(mockedMailSender))
		partido.agregarJugador(daiana)
	
		verify(mockedMailSender, times(1)).send(any(typeof(Mail)))
	}
	
	
 	
	}